// src/websocket.js
class WebSocketService {
  constructor() {
    this.socket = null;
    this.callbacks = new Map();
    this.reconnectInterval = 5000; // 重连间隔5秒
    this.isConnected = false;
  }

  // 连接WebSocket服务器
  connect(url) {
    if (this.socket && this.isConnected) {
      return;
    }

    this.socket = new WebSocket(url);

    this.socket.onopen = () => {
      console.log('WebSocket连接成功');
      this.isConnected = true;
    };

    this.socket.onmessage = (event) => {
      try {
        const data = JSON.parse(event.data);
        console.log('收到WebSocket消息:', data);
        // 根据gameId分发消息
        if (data.gameId !== undefined) {
          // 确保gameId是字符串类型，以便与前端存储的game.id匹配
          const gameId = String(data.gameId);
          const callbacks = this.callbacks.get(gameId) || [];
          console.log(`为游戏ID: ${gameId} 分发消息，有 ${callbacks.length} 个回调函数`);
          callbacks.forEach(callback => callback(data));
        } else {
          console.warn('接收到的WebSocket消息没有gameId字段:', data);
        }
      } catch (error) {
        console.error('解析WebSocket消息失败:', error, '消息内容:', event.data);
      }
    };

    this.socket.onclose = () => {
      console.log('WebSocket连接关闭');
      this.isConnected = false;
      // 自动重连
      setTimeout(() => this.connect(url), this.reconnectInterval);
    };

    this.socket.onerror = (error) => {
      console.error('WebSocket错误:', error);
      this.isConnected = false;
    };
  }

  // 订阅特定游戏的评论
  subscribe(gameId, callback) {
    // 确保gameId是字符串类型
    const stringGameId = String(gameId);
    if (!this.callbacks.has(stringGameId)) {
      this.callbacks.set(stringGameId, []);
      console.log(`创建新的游戏订阅: ${stringGameId}`);
    }
    this.callbacks.get(stringGameId).push(callback);
    console.log(`为游戏 ${stringGameId} 添加订阅，当前订阅数: ${this.callbacks.get(stringGameId).length}`);

    // 返回取消订阅的函数
    return () => {
      if (this.callbacks.has(stringGameId)) {
        const callbacks = this.callbacks.get(stringGameId);
        const index = callbacks.indexOf(callback);
        if (index !== -1) {
          callbacks.splice(index, 1);
          console.log(`取消游戏 ${stringGameId} 的一个订阅，剩余订阅数: ${callbacks.length}`);
          // 如果没有回调了，删除这个gameId的条目
          if (callbacks.length === 0) {
            this.callbacks.delete(stringGameId);
            console.log(`删除游戏 ${stringGameId} 的所有订阅`);
          }
        }
      }
    };
  }

  // 发送消息
  send(message) {
    if (this.socket && this.isConnected) {
      this.socket.send(JSON.stringify(message));
    } else {
      console.error('WebSocket未连接，无法发送消息');
    }
  }

  // 关闭连接
  disconnect() {
    if (this.socket) {
      this.socket.close();
      this.socket = null;
      this.isConnected = false;
      this.callbacks.clear();
    }
  }
}

export const webSocketService = new WebSocketService();